home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-06-22 | 4.3 KB | 176 lines | [TEXT/MMCC] |
- // FinderAE.c
-
- #include "FinderAE.h"
- #include <AppleEvents.h>
- #include <AERegistry.h>
- #include <Aliases.h>
-
- #include "FileSystemStuff.h"
-
- OSErr SelectItem(const FSSpec *file, Boolean bringInFront)
- {
- FSSpec parent;
- OSErr err = GetParent(file, &parent);
-
- if(!err)
- err = FinderOpen(&parent, bringInFront);
-
- if(!err)
- err = SendRevealEvent(&parent, file, bringInFront);
-
- return err;
- }
-
- OSErr FinderOpen(const FSSpec *item, Boolean bringInFront)
- {
- FSSpec parent;
-
- OSErr err = GetParent(item, &parent);
- if(err == fnfErr)
- err = SendOpenSelectionEvent(item, item, bringInFront);
- else if(!err)
- err = SendOpenSelectionEvent(&parent, item, bringInFront);
-
- if(!err && bringInFront)
- ActivateFinder();
-
- return err;
- }
-
-
- OSErr SendRevealEvent(const FSSpec *parent, const FSSpec *item, Boolean bringInFront)
- {
- OSType signature = 'MACS';
- AEDesc addr = { typeNull, nil };
- AEDescList list = { typeNull, nil };
- AppleEvent event = { typeNull, nil }, reply = { typeNull, nil };
- AliasHandle alias = nil;
- AESendMode mode = kAENoReply;
-
-
- OSErr err = NewAlias( 0, item, &alias );
- if(err) goto exit;
-
- err = AECreateDesc (typeApplSignature, (Ptr) &signature, sizeof (signature), &addr);
- if(err) goto exit;
-
- err = AECreateAppleEvent (kAEFinderEvents, kAERevealSelection, &addr, 0, 0, &event);
- if(err) goto exit;
-
- err = AECreateList (nil, 0, false, &list);
- if(err) goto exit;
-
- HLock((Handle)alias);
- err = AEPutPtr( &list, 0, typeAlias, (Ptr)*alias, GetHandleSize((Handle) alias));
- DisposeHandle((Handle) alias);
- if(err) goto exit;
-
- err = NewAlias( 0, parent, &alias );
- if(err) goto exit;
-
- HLock((Handle)alias);
- err = AEPutParamPtr (&event, keyDirectObject, typeAlias, (Ptr)*alias, GetHandleSize((Handle) alias));
- DisposeHandle( (Handle)alias );
- if(err) goto exit;
-
- err = AEPutParamDesc (&event, keySelection, &list);
- if(err) goto exit;
-
- if(bringInFront)
- mode += kAECanSwitchLayer;
- err = AESend ( &event, &reply, mode, kAENormalPriority, kAEDefaultTimeout, nil, nil);
-
- exit:
- if(addr.descriptorType != typeNull)
- AEDisposeDesc (&addr);
- if(event.descriptorType != typeNull)
- AEDisposeDesc (&event);
- if(reply.descriptorType != typeNull)
- AEDisposeDesc (&reply);
- if(list.descriptorType != typeNull)
- AEDisposeDesc (&list);
-
- return err;
- }
-
-
- OSErr SendOpenSelectionEvent(const FSSpec *parent, const FSSpec *item, Boolean bringInFront)
- {
- OSType signature = 'MACS';
- AEDesc addr = { typeNull, nil };
- AEDescList list = { typeNull, nil };
- AppleEvent event = { typeNull, nil }, reply = { typeNull, nil };
- AliasHandle alias = nil;
- AESendMode mode = kAENoReply;
-
- OSErr err = NewAlias( 0, item, &alias );
- if(err) goto exit;
-
- err = AECreateDesc (typeApplSignature, (Ptr) &signature, sizeof (signature), &addr);
- if(err) goto exit;
-
- err = AECreateAppleEvent (kAEFinderEvents, kAEOpenSelection, &addr, 0, 0, &event);
- if(err) goto exit;
-
- err = AECreateList (nil, 0, false, &list);
- if(err) goto exit;
-
- HLock((Handle)alias);
- err = AEPutPtr( &list, 0, typeAlias, (Ptr)*alias, GetHandleSize((Handle) alias));
- DisposeHandle((Handle) alias);
- if(err) goto exit;
-
- err = NewAlias( 0, parent, &alias );
- if(err) goto exit;
-
- HLock((Handle)alias);
- err = AEPutParamPtr (&event, keyDirectObject, typeAlias, (Ptr)*alias, GetHandleSize((Handle) alias));
- DisposeHandle( (Handle)alias );
- if(err) goto exit;
-
- err = AEPutParamDesc (&event, keySelection, &list);
- if(err) goto exit;
-
- if(bringInFront)
- mode += kAECanSwitchLayer;
- err = AESend ( &event, &reply, mode, kAENormalPriority, kAEDefaultTimeout, nil, nil);
-
- exit:
- if(addr.descriptorType != typeNull)
- AEDisposeDesc (&addr);
- if(event.descriptorType != typeNull)
- AEDisposeDesc (&event);
- if(reply.descriptorType != typeNull)
- AEDisposeDesc (&reply);
- if(list.descriptorType != typeNull)
- AEDisposeDesc (&list);
-
- return err;
- }
-
- OSErr ActivateFinder()
- {
- ProcessSerialNumber psn;
- ProcessInfoRec theProc;
- OSErr err = noErr;
- psn.highLongOfPSN = 0;
- psn.lowLongOfPSN = kNoProcess;
-
- theProc.processInfoLength = sizeof(ProcessInfoRec);
- theProc.processName = 0;
- theProc.processAppSpec = 0;
- theProc.processLocation = 0;
-
- while (err == noErr)
- {
- OSErr err = GetNextProcess(&psn);
- err = GetProcessInformation(&psn, &theProc);
- if ((theProc.processType == 'FNDR') &&
- (theProc.processSignature == 'MACS'))
- break;
- }
- if(err == noErr)
- err = SetFrontProcess(&psn);
- return err;
- }
-